package com.Shuang.Demo5;

import java.io.*;
import java.net.Socket;
import java.util.Properties;

public class ServerReaderThread extends Thread{

    private Socket socket;
    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        //对注册和登录方法发过来的信息进行处理
        try {
            System.out.println(socket.getPort() + "上线");
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            while (true) {
                //拿到是那个类型
                int type = dis.readInt();
                //不同处理
                switch (type){
                    case 1:
                        //收到注册方法的用户名密码
                        register();
                        break;
                    case 2:
                        //收到登陆方法的用户名密码
                        logIn();
                        break;
                }
            }
        } catch (Exception e) {
            //追踪离线
            System.out.println(socket.getPort() + "离线了~");
        }
    }

    //处理注册方法
    private void register() throws Exception {
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String loginName = dis.readUTF();
        String passWord = dis.readUTF();

        String result = "注册成功"; //用于最后返回给客户端的响应结果

        //判断登录名是否重复
        if (existLoginName(loginName)){
            result = "用户名重复~注册失败";
        }else {
            //代表用户名不重复可以注册，将用户名和密码写到属性文件中保存
            //先拿到属性文件对象
            Properties properties = new Properties();
            //为属性文件对象设置键和值
            properties.setProperty(loginName, passWord);
            //把属性文件对象写到文件里去 true表追加数据，comments表示注释
            properties.store(new FileWriter(Server.FILE_PATH, true), "");
        }

        //最后响应结果给到客户端
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(result);
        dos.flush();
    }

    //判断用户名是否存在，存在返回true
    private boolean existLoginName(String loginName) throws Exception {
        //用属性文件可以存键值对，将用户名和密码对应起来
        File file = new File(Server.FILE_PATH);
        if (file.exists()){
            //将文件内容 加载出来  相当于Map集合 拿到所有键值对信息
            Properties properties = new Properties();
            properties.load(new FileReader(file));
            if (properties.containsKey(loginName)){
                return true;
            }
        }
        //文件不存在 说明用户名不会重复， 文件中没有包含传过来的用户名也是说明用户名不重复返回false
        return false;
    }

    //处理登录方法
    private void logIn() throws Exception {
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        String loginName = dis.readUTF();
        String passWord = dis.readUTF();

        //用于响应结果给客户端
        String result = "登陆成功";

        if (existLoginName(loginName)){
            //说明用户名存在
            //将属性文件内容 取到属性文件对象中来
            Properties properties = new Properties();
            properties.load(new FileReader(Server.FILE_PATH));

            //校验用户名是否正确
            //根据键取值，如果取不到值说明键不存在
            String okPassWord = properties.getProperty(loginName);
            if (okPassWord == null){
                //说明用户名不存在
                result = "用户名错误，登录失败~";
            }else{
                //说明用户名存在
                //校验用户密码是否正确
                if (okPassWord.equals(passWord)){
                    //说明密码正确

                }else{
                    result = "密码错误，登陆失败~";
                }
            }
        }else{
            //用户名不存在
            result = "您输入的用户名不存在，登陆失败~";
        }

        //最后响应结果给到客户端
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(result);
        dos.flush();
    }

}
